from flask import Flask, request, jsonify, send_from_directory
import os

app = Flask(__name__)

# 配置上传文件夹为根目录
UPLOAD_FOLDER = os.getcwd()  # 获取当前工作目录（根目录）
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# 允许的文件扩展名
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'docx', 'xlsx'}

# 最大文件大小限制 (10MB)
app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024


def allowed_file(filename):
    """检查文件是否允许上传"""
    return '.' in filename and \
        filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/')
def index():
    """提供前端页面"""
    return send_from_directory(os.getcwd(), 'index.html')


@app.route('/upload', methods=['POST'])
def upload_file():
    """处理文件上传"""
    # 检查是否有文件部分
    if 'file' not in request.files:
        return jsonify({
            'success': False,
            'message': '没有文件部分'
        }), 400

    file = request.files['file']

    # 如果用户没有选择文件
    if file.filename == '':
        return jsonify({
            'success': False,
            'message': '没有选择文件'
        }), 400

    # 检查文件是否符合要求
    if file and allowed_file(file.filename):
        try:
            # 保存文件到根目录
            file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)

            # 检查文件是否已存在
            counter = 1
            base_name, ext = os.path.splitext(file.filename)
            while os.path.exists(file_path):
                new_filename = f"{base_name}_{counter}{ext}"
                file_path = os.path.join(app.config['UPLOAD_FOLDER'], new_filename)
                counter += 1

            file.save(file_path)

            return jsonify({
                'success': True,
                'message': f'文件上传成功，已保存为: {os.path.basename(file_path)}',
                'filename': os.path.basename(file_path)
            }), 200
        except Exception as e:
            return jsonify({
                'success': False,
                'message': f'文件保存失败: {str(e)}'
            }), 500
    else:
        return jsonify({
            'success': False,
            'message': f'不支持的文件类型，允许的类型: {", ".join(ALLOWED_EXTENSIONS)}'
        }), 400


@app.errorhandler(413)
def request_entity_too_large(error):
    """处理文件过大的错误"""
    return jsonify({
        'success': False,
        'message': f'文件过大，最大允许大小为 {app.config["MAX_CONTENT_LENGTH"] / (1024 * 1024)} MB'
    }), 413


if __name__ == '__main__':
    app.run(debug=True)
